package juc.thread_communicate;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;

/**
 * join可以理解成是线程合并，当在一个线程调用另一个线程的join方法时，
 * 当前线程阻塞等待被调用join方法的线程执行完毕才能继续执行，
 * 所以join的好处能够保证线程的执行顺序，但是如果调用线程的join方法其实已经失去了并行的意义，
 * 虽然存在多个线程，但是本质上还是串行的，最后join的实现其实是基于等待通知机制的。
 */
public class JoinDemo {

    /**
     * 打印1，2，3
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println(1);
        });

        Thread t2 = new Thread(() -> {
            try {
                t1.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(2);
        });

        Thread t3 = new Thread(() -> {
            try {
                t2.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(3);
        });

        t1.start();
        t2.start();
        t3.start();


        t3.join();
        System.out.println("执行完毕");

//        new CountDownLatch

    }




}
